package com.gitee.dupe.file.utils;//package com.gitee.dupe.file.utils;
//
//import cn.hutool.core.io.FileUtil;
//import cn.hutool.core.util.IdUtil;
//import cn.hutool.core.util.StrUtil;
//import com.gitee.dolt.utils.DateUtils;
//import lombok.Setter;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import java.io.File;
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * 视频转码工具类
// *
// * @author jwc
// */
//@Component
//@Slf4j
//public class ConvertVideoUtils {
//
//    @Setter
//    private static String ffmpegPath;
//    @Setter
//    private static String menCoderPath;
//
//    /**
//     * 转换视频格式
//     *
//     * @param sourcePath   输入视频地址
//     * @param targetExt    目标扩展名
//     * @param outputFolder 输出文件夹
//     * @return
//     */
//    public static String convert(String sourcePath, String targetExt, String outputFolder) {
//        File sourceFile = new File(sourcePath);
//        if (!FileUtil.isFile(sourceFile)) {
//            log.error("文件不存在({})", sourcePath);
//            return null;
//        }
//        if (!targetExt.startsWith(".")) {
//            targetExt = "." + targetExt;
//        }
//        log.info("接收到文件({})需要转换", sourceFile.getName());
//        long beginTime = System.currentTimeMillis();
//        log.info("开始转文件({})", sourcePath);
//        String path = process(sourcePath, targetExt, outputFolder);
//        if (StrUtil.isNotEmpty(path)) {
//            log.info("转换成功");
//            long endTime = System.currentTimeMillis();
//            long timeCha = (endTime - beginTime);
//            String totalTime = DateUtils.zhSumTime(timeCha);
//            log.info("转换视频格式共用了:" + totalTime + " ");
//        } else {
//            log.info("转换失败");
//        }
//        return path;
//    }
//
//    /**
//     * 实际转换视频格式的方法
//     *
//     * @param sourcePath   文件名不带扩展名
//     * @param targetExt    原文件地址
//     * @param outputFolder 目标视频扩展名
//     * @return
//     */
//    private static String process(String sourcePath, String targetExt, String outputFolder) {
//        int type = checkContentType(sourcePath);
//        String path = "";
//        if (type == 0) {
//            // 如果type为0用ffmpeg直接转换
//            path = processVideoFormat(sourcePath, targetExt, outputFolder);
//        } else if (type == 1) {
//            // 如果type为1，将其他文件先转换为avi，然后在用ffmpeg转换为指定格式
//            log.info("转avi");
//            String aviFilePath = processAVI(sourcePath, outputFolder);
//            if (aviFilePath == null) {
//                // avi文件没有得到
//                return "";
//            } else {
//
//                path = processVideoFormat(aviFilePath, targetExt, outputFolder);
//                FileUtil.del(aviFilePath);
//            }
//        }
//        return path;
//    }
//
//    /**
//     * 对ffmpeg无法解析的文件格式(wmv9，rm，rmvb等), 可以先用别的工具（mencoder）转换为avi(ffmpeg能解析的)格式.
//     *
//     * @param sourcePath
//     * @param outputFolder
//     * @return
//     */
//    private static String processAVI(String sourcePath, String outputFolder) {
//        String targetPath = createTargetFilePath(".avi", outputFolder);
//        List<String> commend = new ArrayList<>();
//        commend.add(menCoderPath);
//        commend.add(sourcePath);
//        commend.add("-oac");
//        commend.add("mp3lame");
//        commend.add("-lameopts");
//        commend.add("preset=64");
//        commend.add("-ovc");
//        commend.add("xvid");
//        commend.add("-xvidencopts");
//        commend.add("bitrate=600");
//        commend.add("-of");
//        commend.add("avi");
//        commend.add("-o");
//        commend.add(targetPath);
//        try {
//            ProcessBuilder builder = new ProcessBuilder();
//            builder.command(commend);
//            Process p = builder.start();
//            doWaitFor(p);
//            return targetPath;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//
//    /**
//     * 将mpeg4转为h264编码 为了支持播放器
//     *
//     * @param path
//     * @param targetExt
//     * @param targetPath
//     * @return
//     */
//    public static String processVideoFormatH264(String path, String targetExt, String targetPath) {
//        if (!FileUtil.isFile(path)) {
//            log.error("文件不存在({})", path);
//            return null;
//        }
//        List<String> commend = new ArrayList<>();
//        commend.add(ffmpegPath);
//        commend.add("-i");
//        commend.add(path);
//        commend.add("-vcodec");
//        commend.add("h264");
//        commend.add("-q");
//        commend.add("0");
//        commend.add("-y");
//        commend.add(targetPath);
//        try {
//            ProcessBuilder builder = new ProcessBuilder();
//            builder.command(commend);
//            Process p = builder.start();
//            doWaitFor(p);
//            p.destroy();
//            return targetPath;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//    /**
//     * 检查文件类型
//     *
//     * @param sourceVideoPath 原文件地址
//     * @return
//     */
//    private static int checkContentType(String sourceVideoPath) {
//        String type = sourceVideoPath.substring(sourceVideoPath.lastIndexOf(".") + 1).toLowerCase();
//        // ffmpeg能解析的格式：（asx，asf，mpg，wmv，3gp，mp4，mov，avi，flv等）
//        if (type.equals("avi")) {
//            return 0;
//        } else if (type.equals("mpg")) {
//            return 0;
//        } else if (type.equals("wmv")) {
//            return 0;
//        } else if (type.equals("3gp")) {
//            return 0;
//        } else if (type.equals("mov")) {
//            return 0;
//        } else if (type.equals("mp4")) {
//            return 0;
//        } else if (type.equals("asf")) {
//            return 0;
//        } else if (type.equals("asx")) {
//            return 0;
//        } else if (type.equals("flv")) {
//            return 0;
//        }
//        // 对ffmpeg无法解析的文件格式(wmv9，rm，rmvb等),
//        // 可以先用别的工具（mencoder）转换为avi(ffmpeg能解析的)格式.
//        else if (type.equals("wmv9")) {
//            return 1;
//        } else if (type.equals("rm")) {
//            return 1;
//        } else if (type.equals("rmvb")) {
//            return 1;
//        }
//        return 9;
//    }
//
//    private static int doWaitFor(Process p) {
//        InputStream in = null;
//        InputStream err = null;
//        int exitValue = -1;
//        try {
//            in = p.getInputStream();
//            err = p.getErrorStream();
//            boolean finished = false;
//
//            while (!finished) {
//                try {
//                    while (in.available() > 0) {
//                        in.read();
//                    }
//                    while (err.available() > 0) {
//                        err.read();
//                    }
//
//                    exitValue = p.exitValue();
//                    finished = true;
//
//                } catch (IllegalThreadStateException e) {
//                    Thread.sleep(500);
//                }
//            }
//        } catch (Exception e) {
//            log.error("doWaitFor();: unexpected exception - " + e.getMessage());
//        } finally {
//            try {
//                if (in != null) {
//                    in.close();
//                }
//
//            } catch (IOException e) {
//                log.info(e.getMessage());
//            }
//            if (err != null) {
//                try {
//                    err.close();
//                } catch (IOException e) {
//                    log.info(e.getMessage());
//                }
//            }
//        }
//        return exitValue;
//    }
//
//    private static String createTargetFilePath(String targetExt, String outputFolder) {
//        return FileUtil.file(outputFolder, IdUtil.simpleUUID() + targetExt).getPath();
//    }
//
//}